/**    
 * @Description: 博客园地址：https://www.cnblogs.com/zumengjie/      
 * @author: 顶风少年   
 * @date: 2021年4月7日 下午10:10:00
 */

package datang.dtdb.builder;

import java.util.ArrayList;
import java.util.List;

import datang.dtdb.mapping.ParameterMapping;
import datang.dtdb.mapping.ParameterMapping.Builder;
import datang.dtdb.mapping.SqlSource;
import datang.dtdb.parsing.GenericTokenParser;
import datang.dtdb.parsing.TokenHandler;

/**
 * 最终生成StaticSqlSource
 */
public class SqlSourceBuilder {

	public SqlSource parse(String sql) {
		//处理#{}
		ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler();
		GenericTokenParser genericTokenParser = new GenericTokenParser("#{", "}", handler);
		sql = genericTokenParser.parse(sql);
		//无论是RowSqlSource还是DynamicSqlSource最终都会走里，转换一个StaaticSqlSource
		SqlSource sqlSource = new StaticSqlSource(sql, handler.getParameterMappings());
		return sqlSource;
	}

	private static class ParameterMappingTokenHandler implements TokenHandler {
		List<ParameterMapping> parameterMappings = new ArrayList<>();

		/**
		 * mybatis在GenericTokenParser中直接解析每个#{ } 我这里在具体的实现类解析
		 */
		@Override
		public String handlerToken(String context) {
			parameterMappings.add(new ParameterMapping.Builder().property(context).builder());
			return "?";
		}

		/**
		 * 获取 ? 集合
		 */
		public List<ParameterMapping> getParameterMappings() {
			return parameterMappings;
		}

	}
}
